package gitee_hook

import (
	"strconv"

	"jihulab.com/linksaas/proto-gen-go/events/events_gitee"
)

type IssueHook struct {
	HookId      int32       `json:"hook_id"`     // 钩子 id。
	HookUrl     string      `json:"hook_url"`    // 钩子路由。
	HookName    string      `json:"hook_name"`   // 钩子名，固定为 issue_hooks。
	Password    string      `json:"password"`    // 钩子密码。eg：123456
	Timestamp   string      `json:"timestamp"`   // 触发钩子的时间戳。eg: 1576754827988
	Sign        string      `json:"sign"`        // 钩子根据密钥计算的签名。eg: "rLEHLuZRIQHuTPeXMib9Czoq9dVXO4TsQcmQQHtjXHA="
	Action      string      `json:"action"`      // issue 状态。eg：open
	Issue       *Issue      `json:"issue"`       // issue 信息。
	Repository  *Project    `json:"repository"`  // 仓库信息。
	Project     *Project    `json:"project"`     // 仓库信息。
	Sender      *User       `json:"sender"`      // 触发 hook 的用户信息。
	TargetUser  *User       `json:"target_user"` // 被委托处理 issue 的用户信息。
	User        *User       `json:"user"`        // issue 创建者。
	Assignee    *User       `json:"assignee"`    // issue 负责人。
	UpdatedBy   *User       `json:"updated_by"`  // 触发 hook 的用户信息。
	Iid         string      `json:"iid"`         // issue 对应的标识。eg：IG6E9
	Title       string      `json:"title"`       // issue 标题。eg：这是一个 issue 标题
	Description string      `json:"description"` // issue 的内容体。eg：数据库优化...
	State       string      `json:"state"`       // issue 状态。eg：open
	Milestone   string      `json:"milestone"`   // 里程碑的标题。eg：开源计划
	Url         string      `json:"url"`         // issue 在 Gitee 上对应的 url。eg：https://gitee.com/oschina/git-osc/issues/1
	Enterprise  *Enterprise `json:"enterprise"`  // issue 所属的企业信息。
}

func (item *IssueHook) ToProtoBuf() *events_gitee.IssueEvent {
	ret := &events_gitee.IssueEvent{
		HookId:      item.HookId,
		HookUrl:     item.HookUrl,
		HookName:    item.HookName,
		Sign:        item.Sign,
		Action:      item.Action,
		Issue:       []*events_gitee.Issue{},
		Project:     []*events_gitee.Project{},
		Sender:      []*events_gitee.User{},
		TargetUser:  []*events_gitee.User{},
		User:        []*events_gitee.User{},
		Assignee:    []*events_gitee.User{},
		UpdatedBy:   []*events_gitee.User{},
		Iid:         item.Iid,
		Title:       item.Title,
		Description: item.Description,
		State:       item.State,
		Milestone:   item.Milestone,
		Url:         item.Url,
		Enterprise:  []*events_gitee.Enterprise{},
	}
	if item.Issue != nil {
		ret.Issue = append(ret.Issue, item.Issue.ToProtoBuf())
	}
	if item.Project != nil {
		ret.Project = append(ret.Project, item.Project.ToProtoBuf())
	}
	if item.Sender != nil {
		ret.Sender = append(ret.Sender, item.Sender.ToProtoBuf())
	}
	if item.TargetUser != nil {
		ret.TargetUser = append(ret.TargetUser, item.TargetUser.ToProtoBuf())
	}
	if item.User != nil {
		ret.User = append(ret.User, item.User.ToProtoBuf())
	}
	if item.Assignee != nil {
		ret.Assignee = append(ret.Assignee, item.Assignee.ToProtoBuf())
	}
	if item.UpdatedBy != nil {
		ret.UpdatedBy = append(ret.UpdatedBy, item.UpdatedBy.ToProtoBuf())
	}
	if item.Enterprise != nil {
		ret.Enterprise = append(ret.Enterprise, item.Enterprise.ToProtoBuf())
	}
	ret.Timestamp, _ = strconv.ParseInt(item.Timestamp, 10, 64)
	return ret
}
